home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / inode.h.z / inode.h
C/C++ Source or Header  |  1992-04-03  |  7KB  |  206 lines

  1. #ifndef __SYS_INODE_H__
  2. #define __SYS_INODE_H__
  3.  
  4. /**************************************************************************
  5.  *                                      *
  6.  *          Copyright (C) 1990, Silicon Graphics, Inc.          *
  7.  *                                      *
  8.  *  These coded instructions, statements, and computer programs  contain  *
  9.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  10.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  11.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  12.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  13.  *                                      *
  14.  **************************************************************************/
  15.  
  16. /*    Copyright (c) 1984 AT&T    */
  17. /*      All Rights Reserved      */
  18. /*    THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T    */
  19. /*    The copyright notice above does not evidence any       */
  20. /*    actual or intended publication of such source code.    */
  21.  
  22. #ident    "$Revision: 3.27 $"
  23.  
  24. /*
  25.  *    The I node is the focus of all file activity in unix.
  26.  *    There is a unique inode allocated for each active file,
  27.  *    each current directory, each mounted-on file, text file,
  28.  *    and the root. An inode is 'named' by its dev/inumber
  29.  *    pair. (iget/iget.c) Data, from mode on, is read in from
  30.  *    permanent inode on volume.
  31.  */
  32. #include "sys/sema.h"
  33. #ifdef TRUSTEDIRIX
  34. #include "sys/mac_label.h"
  35. #endif /* TRUSTEDIRIX */
  36.  
  37. typedef    struct    inode
  38. {
  39.     struct    inode    *i_forw;    /* inode hash chain */
  40.     struct    inode    *i_back;    /* '' */
  41.     struct    inode    *av_forw;    /* freelist chain */
  42.     struct    inode    *av_back;    /* '' */
  43.     int    *i_fsptr;    /* "typeless" pointer to fs dependent */
  44.     long    i_number;    /* i number, 1-to-1 with dev address */
  45.     ushort    i_ftype;    /* file type = IFDIR, IFREG, etc. */
  46.     short    i_fstyp;    /* File system type */
  47.     off_t    i_size;        /* size of file */
  48.     ushort    i_uid;        /* owner */
  49.     ushort    i_gid;        /* group of owner */
  50.     ushort    i_flag;
  51.     ushort    i_what;        /* interest mask for imon */
  52.     lock_t    i_reflock;    /* reference counting spinlock */
  53.     cnt_t    i_count;    /* reference count */
  54.     short    i_nlink;    /* directory entries */
  55.     dev_t    i_rdev;        /* Raw device number */
  56.     dev_t    i_dev;        /* device where inode resides */
  57.     struct dquot *i_dquot;    /* quota structure controlling this file */
  58.  
  59.     struct    mount    *i_mntdev;    /* ptr to mount dev inode resides on */
  60.     union i_u {
  61.  
  62.         struct    mount    *i_mton;/* pntr to mount table entry */
  63.                     /* that this inode is "mounted on" */
  64.         struct stdata    *i_sp;  /* Associated stream.        */
  65.         struct socket    *i_soc;    /* unix domain socket */
  66.     } i_un;
  67.     struct fstypsw *i_fstypp;    /* pointer to file system */
  68.                     /* switch structure */
  69.     sema_t    *i_flcksem;        /* semaphore for file locking */
  70.     long    *i_filocks;        /* pointer to filock (structure) list */
  71.     sema_t    i_lock;            /* semaphore for inode lock */
  72.     ulong    i_gen;            /* generation number (for nfs) */
  73.     struct    mregion    *i_mreg;    /* mapregion pointer */
  74.                     /* next two pointers MUST be adjacent */
  75.     struct pfdat *i_pnext;        /* delwri page next pointer */
  76.     struct pfdat *i_pprev;        /* delwri page prev pointer */
  77. #ifdef    TRUSTEDIRIX
  78.     mac_label *i_label;        /* for Mandatory Access Control */
  79.     long    i_plang;        /* index into Plan G database */
  80. #endif    /* TRUSTEDIRIX */
  81. } inode_t;
  82.  
  83. struct    ifreelist
  84. {
  85.     struct    inode    *i_forw;    /* must match struct inode !*/
  86.     struct    inode    *i_back;    /* '' */
  87.     struct inode    *av_forw;
  88.     struct inode    *av_back;
  89.     sema_t    ih_lock;        /* free list lock */
  90. };
  91.  
  92. #define    i_sptr    i_un.i_sp
  93. #define    i_mnton    i_un.i_mton
  94. #define    i_socket    i_un.i_soc
  95. #define ISMAPPED(ip)    (ip)->i_mreg
  96. #define ISDIRTY(ip)    ((ip)->i_pnext != (struct pfdat *)(&(ip)->i_pnext))
  97. #define IP_PGEND(ip)    ((struct pfdat *)(&(ip)->i_pnext))
  98.  
  99. /* flags */
  100.  
  101. /*#define    ILOCK    0x01        /* inode is locked */
  102. #define    IUPD    0x02        /* file has been modified */
  103. #define    IACC    0x04        /* inode access time to be updated */
  104. #define    IMOUNT    0x08        /* inode is mounted on */
  105. #define    IWANT    0x10        /* some process waiting on lock */
  106. #define    ITEXT    0x20        /* inode is pure text prototype */
  107. #define    ICHG    0x40        /* inode has been changed */
  108. #define ISYN    0x80        /* do synchronous write for iupdate */
  109. #define    IADV    0x100        /* advertised */
  110. #define    IDOTDOT    0x200        /* object of remote mount */
  111. #define    INODELAY 0x400        /* do immediate write for iupdate */
  112. #define    IRMOUNT    0x800        /* remotely mounted    */
  113. #define    IISROOT    0x1000        /* This is a root inode of an fs */
  114. #define IWROTE    0x2000        /* write has happened since open */
  115. #define IHASH    0x4000        /* inode is on a hash list */
  116. #define IWASMMAP 0x8000        /* file is or was mmap'ed at some point */
  117.                 /* allows us to keep caches consistent */
  118.  
  119. /*
  120.  * File types (inode formats).
  121.  */
  122. #define    IFMT    0xf000        /* type of file */
  123. #define        IFDIR    0x4000    /* directory */
  124. #define        IFCHR    0x2000    /* character special */
  125. #define        IFBLK    0x6000    /* block special */
  126. #define        IFREG    0x8000    /* regular */
  127. #define        IFMPC    0x3000    /* multiplexed char special */
  128. #define        IFMPB    0x7000    /* multiplexed block special */
  129. #define        IFIFO    0x1000    /* fifo special */
  130. #define        IFLNK    0xA000    /* symbolic link */
  131. #define        IFSOCK    0xC000    /* socket */
  132.  
  133. /*
  134.  * File execution and access modes.
  135.  */
  136. #define    ISUID        0x800    /* set user id on execution */
  137. #define    ISGID        0x400    /* set group id on execution */
  138. #define ISVTX        0x200    /* save swapped text even after use */
  139. #define    IREAD        0x100    /* read permission */
  140. #define    IWRITE        0x080    /* write permission */
  141. #define    IEXEC        0x040    /* execute permission */
  142. #define    ICDEXEC        0x020    /* cd permission */
  143. #define    IOBJEXEC    0x010    /* execute as an object file */
  144.                 /* i.e., 410, 411, 413 */
  145. #define IMNDLCK        0x001    /* mandatory locking set */
  146.  
  147. #define    MODEMSK        0xfff    /* Nine permission bits - read/write/ */
  148.                 /* execute for user/group/others and */
  149.                 /* ISUID, ISGID, and ISVTX */
  150.                 /* This is another way of saying: */
  151.                 /* (ISUID|ISGID|ISVTX| */
  152.                 /* (IREAD|IWRITE|IEXEC)| */
  153.                 /* ((IREAD|IWRITE|IEXEC)>>3)| */
  154.                 /* ((IREAD|IWRITE|IEXEC)>>6)) */
  155. #define    PERMMSK        0x1ff    /* Nine permission bits: */
  156.                 /* ((IREAD|IWRITE|IEXEC)| */
  157.                 /* ((IREAD|IWRITE|IEXEC)>>3)| */
  158.                 /* ((IREAD|IWRITE|IEXEC)>>6)) */
  159.  
  160. #ifdef _KERNEL
  161. extern struct inode inode[];    /* The inode table itself */
  162. extern struct ifreelist ifreelist;
  163. extern sema_t iflcksema;
  164. extern lock_t mreg_lock;
  165.  
  166. #define plock(IP) { \
  167.     psema(&(IP)->i_lock, PINOD); \
  168.     ASSERT(valusema(&(IP)->i_lock) <= 0); \
  169. }
  170.  
  171. #define cplock(IP)    cpsema(&(IP)->i_lock)
  172.  
  173. #define prele(IP) { \
  174.     ASSERT(valusema(&(IP)->i_lock) <= 0); \
  175.     vsema(&(IP)->i_lock); \
  176. }
  177.  
  178. #define IHOLD(IP) { \
  179.     int ihold_s = splock((IP)->i_reflock); \
  180.     ASSERT((IP)->i_count > 0); \
  181.     (IP)->i_count++; \
  182.     spunlock((IP)->i_reflock, ihold_s); \
  183. }
  184.  
  185. #define IDROP(IP) { \
  186.     int idrop_s = splock((IP)->i_reflock); \
  187.     ASSERT((IP)->i_count > 1); \
  188.     --(IP)->i_count; \
  189.     spunlock((IP)->i_reflock, idrop_s); \
  190. }
  191.  
  192. #define IRELE(IP) { \
  193.     plock(IP); \
  194.     iput(IP); \
  195. }
  196.  
  197. extern struct inode    *getinode(struct mount *, int, ino_t, int);
  198. extern struct inode    *iget(struct mount *, ino_t);
  199. extern void        iput(struct inode *);
  200. extern void        iuncache(struct inode *);
  201. extern void        ifreebusy(struct inode *);
  202. extern int        iflush(struct mount *);
  203.  
  204. #endif    /* _KERNEL */
  205. #endif    /* __SYS_INODE_H__ */
  206.